home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / ir / byte_order.h next >
C/C++ Source or Header  |  1995-05-09  |  4KB  |  113 lines

  1. /* byte_order:
  2.  *  This file contains some useful routines to handle the differences between
  3.  *  big and little endian machines. The macros may look a little unwieldy, but
  4.  *  any modern optimiser will take care of things quite nicely. 
  5.  *
  6.  * $Log:    byte_order.h,v $
  7.  * Revision 1.1  92/03/15  08:49:03  jonathan
  8.  * Initial revision
  9.  * 
  10.  */
  11.  
  12. #include "../config.h"
  13.  
  14.  
  15. /* ASSIGN_HELPER:
  16.     This macro turns a pointer to long into a pointer to a {1,2,3} byte value
  17. */
  18.  
  19. #ifdef BIG_ENDIAN
  20. #define ASSIGN_HELPER(var,size) (FOUR_BYTE*)((ONE_BYTE*) &var+(sizeof(FOUR_BYTE)-size))
  21. #else
  22. #define ASSIGN_HELPER(var,size)  (FOUR_BYTE *)&var
  23. #endif 
  24.  
  25. /*
  26.   ASSIGN(var,size,src,unit,offset): 
  27.      var : variable to store into
  28.      size: how big is value?
  29.      src : source address
  30.      unit,offset: 
  31.       These paramaters are used to help optimise the macro when used with 
  32.       structured data. unit should be the size of one record, and offset should
  33.       be the offset of this item within that record. These paramaters are *not*
  34.       used to calculate the source address - they are used purely to let the
  35.       compiler take advantage of possibly aligned data. 
  36.  
  37.       ASSIGN_NATIVE uses native byte ordering
  38.       ASSIGN_CANON  uses canonical (big_endian) byte ordering
  39. */
  40.  
  41. #if defined(NATIVE_ORDER) || defined(BIG_ENDIAN)
  42. #define ASSIGN ASSIGN_NATIVE
  43. #else
  44. #define ASSIGN ASSIGN_CANON
  45. #endif
  46.  
  47. #define ASSIGN_NATIVE(var,size,src,unit,offset) {\
  48.   FOUR_BYTE *dst;\
  49.     dst = ASSIGN_HELPER(var,size);\
  50.   switch(size) \
  51.     {\
  52.     case 1:\
  53.       var = 0;\
  54.       *(unsigned ONE_BYTE*)dst= *(unsigned ONE_BYTE*)(src);\
  55.       break;\
  56.     case 2:\
  57.       if (!(unit % TWO_BYTE_ALIGN) && !(offset % TWO_BYTE_ALIGN)) {\
  58.         var = 0;\
  59.     *(unsigned TWO_BYTE *)dst = *(unsigned TWO_BYTE *)(src);\
  60.       } else {\
  61.     var =0;\
  62.     *(unsigned ONE_BYTE *)dst = *(unsigned ONE_BYTE *)(src);\
  63.     *((unsigned ONE_BYTE *)dst+1) = *(unsigned ONE_BYTE*)(src+1);\
  64.       }\
  65.       break;\
  66.     case 3:\
  67.       var = 0;\
  68.       *(unsigned ONE_BYTE *)dst = *(unsigned ONE_BYTE *)(src);\
  69.       *((unsigned ONE_BYTE *)dst+1) = *(unsigned ONE_BYTE*)(src+1);\
  70.       *((unsigned ONE_BYTE *)dst+2) = *(unsigned ONE_BYTE*)(src+2);\
  71.       break;\
  72.     case 4:\
  73.       if (!(unit % FOUR_BYTE_ALIGN) && !(offset % FOUR_BYTE_ALIGN)) { \
  74.     *dst = *(unsigned FOUR_BYTE *)(src);\
  75.       } else {\
  76.     *(unsigned ONE_BYTE *)dst = *(unsigned ONE_BYTE *)(src);\
  77.     *((unsigned ONE_BYTE *)dst+1) = *(unsigned ONE_BYTE*)(src+1);\
  78.     *((unsigned ONE_BYTE *)dst+2) = *(unsigned ONE_BYTE*)(src+2);\
  79.     *((unsigned ONE_BYTE *)dst+3) = *(unsigned ONE_BYTE*)(src+3);\
  80.       }\
  81.       break;\
  82.     }\
  83. }
  84.  
  85. #define ASSIGN_CANON(var,size,src,unit,offset) {\
  86.   FOUR_BYTE *dst;\
  87.     dst = ASSIGN_HELPER(var,size);\
  88.   switch(size) \
  89.     {\
  90.     case 1:\
  91.       var = 0;\
  92.       *(unsigned ONE_BYTE*)dst= *(unsigned ONE_BYTE*)(src);\
  93.       break;\
  94.     case 2:\
  95.       var =0;\
  96.       *(unsigned ONE_BYTE *)dst = *(unsigned ONE_BYTE *)(src+1);\
  97.       *((unsigned ONE_BYTE *)dst+1) = *(unsigned ONE_BYTE*)(src);\
  98.       break;\
  99.     case 3:\
  100.       var = 0;\
  101.       *(unsigned ONE_BYTE *)dst = *(unsigned ONE_BYTE *)(src+2);\
  102.       *((unsigned ONE_BYTE *)dst+1) = *(unsigned ONE_BYTE*)(src+1);\
  103.       *((unsigned ONE_BYTE *)dst+2) = *(unsigned ONE_BYTE*)(src);\
  104.       break;\
  105.     case 4:\
  106.       *(unsigned ONE_BYTE *)dst = *(unsigned ONE_BYTE *)(src+3);\
  107.       *((unsigned ONE_BYTE *)dst+1) = *(unsigned ONE_BYTE*)(src+2);\
  108.       *((unsigned ONE_BYTE *)dst+2) = *(unsigned ONE_BYTE*)(src+1);\
  109.       *((unsigned ONE_BYTE *)dst+3) = *(unsigned ONE_BYTE*)(src);\
  110.       break;\
  111.     }\
  112. }
  113.